/**
 * \file   NodeIT.h
 * \author Babinot Alexandre, Guilet Pierre
 *  \version 1.0
 *  \date 24 janvier 2012
 */
#ifndef NODEIT_H
#define NODEIT_H
#include<vector>
#include "pNode.h"

template<class T>
class pNode;
template<class T>
class Node;

/**
 *\class NodeIT
 *
 * \brief classe permettant de recuperer le pNode à l'index i d'un Node
 */
template<class T>
class NodeIT{

private:
Node<T> * nod;
//TODO : A SUPPRIMER car iterate est la meme chose
pNode<T> * pNode_;
//iterate pointe sur un pNode ou se trouve la cle d'un algo de recherche...
typename std::vector<pNode<T>*>::iterator iterate;


public:
    /**
     * \fn NodeIT(Node<T>* n,typename std::vector<pNode<T>*>::iterator i )
     *  \brief Constructeur d'un nouveau NodeIT
     *  \param n valeur du Node
     *  \param i itérateur sur la valeur
     */
	NodeIT(Node<T>* n,typename std::vector<pNode<T>*>::iterator i );
    /**
     * \fn NodeIT(Node<T>* n,typename std::vector<pNode<T>*>::iterator i )
     *  \brief Constructeur d'un nouveau NodeIT
     *  \param n valeur du Node
     *  \param i itérateur sur la valeur
     *  \param pNode valeur du pNode optionnel
     */
	NodeIT(Node<T>* n,typename std::vector<pNode<T>*>::iterator i, pNode<T>* pNode);
    /**
     * \fn getNode()
     *  \brief recupère le noeud stocké
     *  \return recupère le noeud stocké
     */
	Node<T>* getNode();
    /**
     * \fn getPNode()
     *  \brief recupère le PNode stocké
     *  \return recupère le PNode stocké
     */
	pNode<T>* getPNode();
    /**
     * \fn getSizePnodeVector()
     *  \brief recupère la taille du vecteur du noeud
     *  \return retourne la taille du vecteur du noeud
     */
	unsigned int getSizePnodeVector();
    /**
     * \fn removePNodeFromVector(T key)
     *  \brief retire un Pnode du vecteur
     *  \param la valeur à supprimer
     */
	int removePNodeFromVector(T key);
    /**
     * \fn getIter()
     *  \brief récupère l'itérateur sur le vecteur de Pnodes
     *  \return retourne l'itérateur 
     */
	typename std::vector<pNode<T>*>::iterator getIter();
    /**
     * \fn setIter()
     *  \brief actualise l'itérateur sur le vecteur de Pnodes
     *  \param l'itérateur 
     */
	void setIter(typename std::vector<pNode<T>*>::iterator ite);
	
};
using namespace std;

template<class T>
NodeIT<T>::NodeIT(Node<T>* n,typename std::vector<pNode<T>*>::iterator i ){
	nod=n;
	iterate=i;
}

template<class T>
NodeIT<T>::NodeIT(Node<T>* n,typename std::vector<pNode<T>*>::iterator i, pNode<T>* pNode){
	nod=n;
	iterate=i;
	pNode_ = pNode;
}

template<class T>
Node<T>* NodeIT<T>::getNode(){
	return nod;
}

template<class T>
pNode<T>* NodeIT<T>::getPNode(){
	return pNode_;
}

template<class T>
unsigned int NodeIT<T>::getSizePnodeVector(){
    int cmp=1;
    for (typename vector<pNode<T>*>::iterator itPNode = nod->getPNodesVector().begin(); itPNode!=nod->getPNodesVector().end()-2; ++itPNode) {
	    cmp++;
    }
	return cmp;
}

template<class T>
typename std::vector<pNode<T>*>::iterator NodeIT<T>::getIter(){
	return iterate;
}

template<class T>
void NodeIT<T>::setIter(typename std::vector<pNode<T>*>::iterator ite){
	iterate=ite;
}

template<class T>
int NodeIT<T>::removePNodeFromVector(T key){
    for (typename vector<pNode<T>*>::iterator it = nod->getPNodesVector().begin(); it!=nod->getPNodesVector().end(); ++it) {
        if((*it)->getValeur()==key){
            nod->deleteKey(it);
        }
    }
	return 1;
}


#endif
